package com.obelisco.vista.plantillas;

import java.util.List;
import java.util.Map;
import java.util.Vector;

import nextapp.echo2.app.Component;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.vista.componentes.ComponenteAsistenteDatosListener;
import com.obelisco.vista.componentes.ComponenteDatosListener;

import com.obelisco.vista.componentes.TipoFuncion;

public class VentanaAsistenteSimple extends VentanaAsistenteBase 
{
	List parametrosAsistente;
	
	private Object objetoEntidad;
	
	private Vector<ComponenteDatosListener> listeners = new Vector<ComponenteDatosListener>();
	
	private Vector<ComponenteAsistenteDatosListener> listenersAsistente = new Vector<ComponenteAsistenteDatosListener>();
	@Override
	public Object getObjetoEntidad() {
		// TODO Auto-generated method stub
		return objetoEntidad;
	}
	
	@Override
	public void inicializar() {
		// TODO Auto-generated method stub
		
		this.getAreaTrabajo().add((Component)ventanas.get(0));
		distribuirEventoInicializar();
	}

	@Override
	public void onConfirmarCambios(Object objeto, TipoFuncion funcion,
			String nombre) {
		
			distribuirEventoConfirmarCambios(objeto, funcion, nombre);
		
	}

	@Override
	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoConsultar(objeto);
	}

	@Override
	public void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion,
			String nombre) {
		// TODO Auto-generated method stub
		// En este tipo de Dialogo NO se invoca
	}

	@Override
	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoIncluir(objeto);
	}

	@Override
	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoModificar(objeto);
	}

	@Override
	public boolean onValidarDatos(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		return distribuirEventoValidarDatos(objeto,funcion,nombre);
	}

	@Override
	public void setObjetoEntidad(Object objetoEntidad) {
		// TODO Auto-generated method stub
		this.objetoEntidad = objetoEntidad;
		distribuirEventoObjetoEntidad(objetoEntidad);
		
 	}
	
	private void distribuirEventoObjetoEntidad(Object object) {
		for (ComponenteDatosListener l : listeners) {
			l.onObjetoEntidad(object);
		}
	}
	
	private void distribuirEventoParametrosAsistente() {
		for (ComponenteAsistenteDatosListener l : listenersAsistente) {			
			if (l.equals(ventanas.get(cualVentana-2)))
			{				
				setParametrosAsistente(l.getParametrosAsistente());
			}			
		}
	}
	
	private void distribuirEventoIncluir(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onIncluir(objeto);
		}
	}
	
	private void distribuirEventoModificar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onModificar(objeto);
		}
	}

	private void distribuirEventoConsultar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onConsultar(objeto);
		}
	}

	private boolean distribuirEventoValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {

		boolean validarDatos = true;

		for (ComponenteDatosListener l : listeners) {
			if (l.equals(ventanas.get(cualVentana-1)))
			{				
				if (!l.onValidarDatos(objeto, tipo, nombre)) 
				{
					validarDatos = false;
				}				
			}			
		}

		return validarDatos;
	}

	private void distribuirEventoConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {		
		for (ComponenteDatosListener l : listeners) {
			l.onConfirmarCambios(objeto, tipo, nombre);
		}
	}

	private void distribuirEventoInicializar() {

		for (ComponenteDatosListener l : listeners) {
			l.onInicializar();
		}		
	}
	
	private void distribuirEventoAnterior(List parametrosAsistente) {

		for (ComponenteAsistenteDatosListener l : listenersAsistente) {
			l.onAnterior(parametrosAsistente);
		}

	}
	
	private void distribuirEventoSiguiente(List parametrosAsistente) {

		for (ComponenteAsistenteDatosListener l : listenersAsistente) {			
			l.onSiguiente(parametrosAsistente);
		}

	}

	public void addComponenteDatosListener(ComponenteDatosListener listener) {
		listeners.add(listener);
	}
	
	public void addComponenteAsistenteDatosListener(ComponenteAsistenteDatosListener listener) {
		listenersAsistente.add(listener);
	}

	public void removeCatalogoListener(ComponenteDatosListener listener) {
		listeners.remove(listener);
	}

	public void setComponentesDatos(
			Map<String,ComponenteAsistenteDatosListener> componentes) {
		
		for (String clave : componentes.keySet()) {

			Object componente = componentes.get(clave);

			if (componente instanceof Component) {

				Component component = (Component) componente;
				ventanas.add(component);
				if (isUsarTab()) {					
					TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
					contenedorLayoutData.setTitle(clave);
					component.setLayoutData(contenedorLayoutData);
				}
						
				//this.getAreaTrabajo().add(component);
				addComponenteDatosListener((ComponenteDatosListener) componente);
				addComponenteAsistenteDatosListener((ComponenteAsistenteDatosListener) componente);
			}

		}
		//this.getAreaTrabajo().add((Component)ventanas.get(0));
		
		/*for (Iterator iterComponente = componentes.iterator(); iterComponente.hasNext();) {
			Object componente = (Object) iterComponente.next();
			
			if (componente instanceof Component) {

				Component component = (Component) componente;

				if (isUsarTab()) {					
					TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
					//contenedorLayoutData.setTitle(clave);
					component.setLayoutData(contenedorLayoutData);
				}

				addComponenteAsistenteDatosListener((ComponentesAsistenteDatosListener) componente);
			}
		}
		this.getAreaTrabajo().add((Component)ventanas.get(0));*/
	}

	
	@Override
	public void onAnterior() {
		//distribuirEventoParametrosAsistente();		
		distribuirEventoAnterior(getParameterosAsistente());
	}

	@Override
	public void onSiguiente() {
		distribuirEventoParametrosAsistente();
		distribuirEventoSiguiente(getParameterosAsistente());
	}

	@Override
	public List getParameterosAsistente() {		
		return parametrosAsistente;
	}

	@Override
	public void setParametrosAsistente(List parametrosAsistente) {
		this.parametrosAsistente = parametrosAsistente;
		//distribuirEventoParametrosAsistente(parametrosAsistente);		
	}

	/*@Override
	public boolean onValidarExcepcion() {
		// TODO Auto-generated method stub
		return false;
	}*/
		
}